
<!DOCTYPE HTML>
<html lang="zh-hans" >
    <head>
        <meta charset="UTF-8">
        <title>8 标准库概览 · C++导览 第二版 简体中文版</title>
        <meta http-equiv="X-UA-Compatible" content="IE=edge" />
        <meta name="description" content="">
        <meta name="generator" content="HonKit 5.1.1">
        <meta name="author" content="Windsting">
        
        
    
    <link rel="stylesheet" href="gitbook/style.css">

    
            
                
                <link rel="stylesheet" href="gitbook/@dogatana/honkit-plugin-page-toc-button/plugin.css">
                
            
                
                <link rel="stylesheet" href="gitbook/@dogatana/honkit-plugin-back-to-top-button/plugin.css">
                
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-forkmegithub/plugin.css">
                
            
                
                <link rel="stylesheet" href="gitbook/@honkit/honkit-plugin-highlight/website.css">
                
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-search/search.css">
                
            
                
                <link rel="stylesheet" href="gitbook/gitbook-plugin-fontsettings/website.css">
                
            
        

    

    
        
        <link rel="stylesheet" href="styles/website.css">
        
    
        
    
        
    
        
    
        
    
        
    

        
    
    
    <meta name="HandheldFriendly" content="true"/>
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <meta name="apple-mobile-web-app-capable" content="yes">
    <meta name="apple-mobile-web-app-status-bar-style" content="black">
    <link rel="apple-touch-icon-precomposed" sizes="152x152" href="gitbook/images/apple-touch-icon-precomposed-152.png">
    <link rel="shortcut icon" href="gitbook/images/favicon.ico" type="image/x-icon">

    
    <link rel="next" href="ch09.html" />
    
    
    <link rel="prev" href="ch07.html" />
    

    </head>
    <body>
        
<div class="book honkit-cloak">
    <div class="book-summary">
        
            
<div id="book-search-input" role="search">
    <input type="text" placeholder="输入并搜索" />
</div>

            
                <nav role="navigation">
                


<ul class="summary">
    
    
    
        
        <li>
            <a href="https://github.com/windsting/a-tour-of-cpp-2nd-cn" target="_blank" class="custom-link">Github Link</a>
        </li>
    
    

    
    <li class="divider"></li>
    

    
        
        
    
        <li class="chapter " data-level="1.1" data-path="translation_note.html">
            
                <a href="translation_note.html">
            
                    
                    译者言
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.2" data-path="./">
            
                <a href="./">
            
                    
                    前言
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.3" data-path="ch01.html">
            
                <a href="ch01.html">
            
                    
                    1 基础知识
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.4" data-path="ch02.html">
            
                <a href="ch02.html">
            
                    
                    2 用户定义类型
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.5" data-path="ch03.html">
            
                <a href="ch03.html">
            
                    
                    3 模块化
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.6" data-path="ch04.html">
            
                <a href="ch04.html">
            
                    
                    4 类
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.7" data-path="ch05.html">
            
                <a href="ch05.html">
            
                    
                    5 基本操作
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.8" data-path="ch06.html">
            
                <a href="ch06.html">
            
                    
                    6 模板
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.9" data-path="ch07.html">
            
                <a href="ch07.html">
            
                    
                    7 概束和泛型编程
            
                </a>
            

            
        </li>
    
        <li class="chapter active" data-level="1.10" data-path="ch08.html">
            
                <a href="ch08.html">
            
                    
                    8 标准库概览
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.11" data-path="ch09.html">
            
                <a href="ch09.html">
            
                    
                    9 字符串和正则表达式
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.12" data-path="ch10.html">
            
                <a href="ch10.html">
            
                    
                    10 输入输出
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.13" data-path="ch11.html">
            
                <a href="ch11.html">
            
                    
                    11 容器
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.14" data-path="ch12.html">
            
                <a href="ch12.html">
            
                    
                    12 算法
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.15" data-path="ch13.html">
            
                <a href="ch13.html">
            
                    
                    13 实用功能
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.16" data-path="ch14.html">
            
                <a href="ch14.html">
            
                    
                    14 数值
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.17" data-path="ch15.html">
            
                <a href="ch15.html">
            
                    
                    15 并发
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.18" data-path="ch16.html">
            
                <a href="ch16.html">
            
                    
                    16 历史及兼容性
            
                </a>
            

            
        </li>
    
        <li class="chapter " data-level="1.19" data-path="idx.html">
            
                <a href="idx.html">
            
                    
                    索引
            
                </a>
            

            
        </li>
    

    

    <li class="divider"></li>

    <li>
        <a href="https://github.com/honkit/honkit" target="blank" class="gitbook-link">
            本书使用 HonKit 发布
        </a>
    </li>
</ul>


                </nav>
            
        
    </div>

    <div class="book-body">
        
            <div class="body-inner">
                
                    

<div class="book-header" role="navigation">
    

    <!-- Title -->
    <h1>
        <i class="fa fa-circle-o-notch fa-spin"></i>
        <a href="." >8 标准库概览</a>
    </h1>
</div>




                    <div class="page-wrapper" tabindex="-1" role="main">
                        <div class="page-inner">
                            
<div id="book-search-results">
    <div class="search-noresults">
    
                                <section class="normal markdown-section">
                                

    
        
                                <p><a class="en-page-number" id="107"></a></p>
<div class="chapter-number"><p class="chapter-number">8</p></div>

<h1 id="library-overview">库概述 </h1>
<blockquote>
<p>如果只是临时露个小怯，</p>
<p>还费那劲学它干嘛呢？</p>
<p>—— <span title="出自连环漫画集“The Complete Calvin and Hobbes”其中一册叫“Attack of the Deranged Mutant Killer Monster Snow Goons”，中文版为《卡尔文与霍布斯虎》系列丛书的第三册《变种雪怪杀手》，其中把此句译为“如果无知是瞬时的，为什么还要花时间学习呢？”，译者结合该小故事的上下文，认为该如此翻译。">霍布斯虎</span><sup><a href="#fn_1" id="reffn_1">1</a></sup></p>
</blockquote>
<h2 id="8.1">8.1 导言 </h2>
<p>任何重要的程序都不能单纯使用基本的编程语言。首先，要开发一套程序库。
这些库会构成后续工作的基石。
如果仅使用基本的编程语言编写，绝大多数程序都很烦冗，
相反，采用良好的程序库，几乎任何业务都能化繁为简。</p>
<p>继1-7章之后，9-15章对主要的标准库部件作了概览。
我很简略地介绍了实用的标准库类型，比如<code>string</code>、<code>ostream</code>、<code>variant</code>、
<code>vector</code>、<code>map</code>、<code>path</code>、<code>unique_ptr</code>、<code>thread</code>、<code>regex</code>和<code>complex</code>，
及其基本用法。</p>
<p>像1-7章一样，对部分细节无法完全理解的时候，千万别分神、灰心。
本章的目的是：基本理解最实用的标准库部件。</p>
<p>标准库的内容占据了 ISO C++ 标准超过三分之二。
请浏览并尽量采用它，摒弃山寨货。
许多思想注入了它的设计当中，更多的则进入了实现，
还有许多劳作将投入到它的维护和扩展中去。</p>
<p>本书所描述的标准库部件，是每个完整C++实现的组成部分。
除这些标准库组件以外，多数实现还提供了
“图形用户接口(graphical user interface)”系统(GUIs)、
Web接口、数据库接口等等。
类似地，多数应用开发环境还为企业级或工业级“标准”的开发 和/或
运行环境提供了“基本库”。
在此，我不会讲述那些系统和库。</p>
<p><a class="en-page-number" id="108"></a></p>
<p>而旨在为标准定义下的C++提供一个自洽的描述，并确保示例可移植。
当然，也鼓励程序员去浏览各个系统提供的范畴广泛的基础部件。</p>
<h2 id="8.2">8.2 标准库组件 </h2>
<p>标准库提供的基础部件可按此分类：</p>
<ul>
<li>运行时语言支持（即：用于资源分配以及提供运行时类型信息）。</li>
<li>C 标准库（带有极细微的调整，以便降低与类型系统的冲突）。</li>
<li>字符串（对国际化字符集、本地化以及子字符串的只读检视提供支持）；参见 §9.2。</li>
<li>对正则表达式匹配的支持；参见 §9.4。</li>
<li>I/O 流，是一个针对输入输出的可扩展框架，用户可添加自定义的类型、流、缓冲策略、
  地区和字符集（第10章）。还有个文件系统库，以可移植方式操作文件（§10.10）。</li>
<li>容器（例如<code>vector</code>和<code>map</code>）框架和算法
  （例如<code>find()</code>、<code>sort)</code>和<code>merge()</code>）；参见第11章和第12章。
  习惯上，该框架被称为 STL[Stepanov,1994]，对用户而言是可扩展的，
可添加自定义容器和算法。</li>
<li>对数值计算的支持（例如标准的数学函数、复数、带算术运算的向量和随机数生成器）；
  参见 §4.2.1 和第14章。</li>
<li>对并发运算的支持，包括<code>thread</code>和锁；参见第15章。
  对并发的支持非常基础，因此用户能够以库的形式，为并发的新模型添加支持。</li>
<li>多数STL算法以及部分数值算法的并行版本（即<code>sort()</code>和<code>reduce()</code>）；
  参见 §12.9 和 §14.3.1。</li>
<li>用于支持模板元编程的实用工具（即类型trait；§13.9），
  STL风格的泛型编程（即<code>pair</code>;§13.4.3），通用编程
  （即<code>variant</code>和<code>optional</code>；§13.5.1，§13.5.2）和<code>clock</code>（§13.7）。</li>
<li>对高效且安全的通用资源管理提供支持，外加一个可选的垃圾回收器接口（§5.3）。</li>
<li>针对资源管理的“智能指针（smart pointers）”
  （即 <code>unique_ptr</code>和<code>shared_ptr</code>,§13.2.1）。</li>
<li>特殊用途的容器，例如：<code>array</code>(§13.4.1)、<code>bitset</code>(§13.4.2)
  和<code>tuple</code>(§13.4.3)。</li>
<li>常见单位的后缀，例如：毫秒(millisecond)的<code>ms</code>和
  虚部(imaginary)的<code>i</code>(§15.4.4)。</li>
</ul>
<p>某个类被纳入库中的判断标准是：</p>
<ul>
<li>它能给几乎所有C++程序员（不论新手还是专家）带来益处，</li>
<li>相对于该部件的简单版本而言，通用版本不会显著增加负担，并且</li>
<li>基本用法应该易于学习（相较其功能固有的复杂性而言）。</li>
</ul>
<p>基本上，C++标准库提供了最常见的基础数据结构，以及应用其上的基本算法。</p>
<p><a class="en-page-number" id="109"></a></p>
<h2 id="8.3">8.3 标准库头文件和命名空间 </h2>
<p>每个标准库部件都通过某些头文件提供。例如：</p>
<pre><code class="lang-cpp"><span class="hljs-meta">#<span class="hljs-keyword">include</span><span class="hljs-string">&lt;string&gt;</span></span>
<span class="hljs-meta">#<span class="hljs-keyword">include</span><span class="hljs-string">&lt;list&gt;</span></span>
</code></pre>
<p>这样就可以使用标准的<code>string</code>和<code>list</code>了。</p>
<p>标准库被定义在一个名为<code>std</code>的命名空间(§3.4)里。
要使用标准库部件，可借助前缀<code>std::</code>：</p>
<pre><code class="lang-cpp">std::string sheep {<span class="hljs-string">&quot;Four legs Good; two legs Baaad!&quot;</span>};
std::list&lt;std::string&gt; slogans {<span class="hljs-string">&quot;War is Peace&quot;</span>, <span class="hljs-string">&quot;Freedom is Slavery&quot;</span>, <span class="hljs-string">&quot;Ignorance is Strength&quot;</span>};
</code></pre>
<p>出于简洁的原因，本书极少像例中那样显式使用<code>std::</code>，
也不总显式<code>#include</code>必要的头文件。
要编译并运行这个代码片段，必须<code>#include</code>对应的头文件并确保其声明的名称可访问。
例如：</p>
<pre><code class="lang-cpp"><span class="hljs-meta">#<span class="hljs-keyword">include</span><span class="hljs-string">&lt;string&gt;</span>        <span class="hljs-comment">// make the standard string facilities accessible</span></span>
<span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> std;    <span class="hljs-comment">// make std names available without std:: prefix</span>
string s {<span class="hljs-string">&quot;C++ is a general−purpose programming language&quot;</span>}; <span class="hljs-comment">// OK: string is std::string</span>
</code></pre>
<p>一般来说，把某个命名空间里的所有名称一股脑丢进全局这种做法，颇有不妥。
但在此书专注于使用标准库，而熟知其涵盖的内容颇为有益。</p>
<p>以下是标准库头文件的一个精选，其中所有声明在命名空间<code>std</code>里：</p>
<table>
<thead>
<tr>
<th></th>
<th>精选标准库头文件</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>&lt;algorithm&gt;</code></td>
<td><code>copy()</code>,<code>find()</code>,<code>sort()</code></td>
<td>第12章</td>
</tr>
<tr>
<td><code>&lt;array&gt;</code></td>
<td><code>array</code></td>
<td>§13.4.1</td>
</tr>
<tr>
<td><code>&lt;chrono&gt;</code></td>
<td><code>duration</code>,<code>time_point</code></td>
<td>§13.7</td>
</tr>
<tr>
<td><code>&lt;cmath&gt;</code></td>
<td><code>sqrt()</code>,<code>pow()</code></td>
<td>§14.2</td>
</tr>
<tr>
<td><code>&lt;complex&gt;</code></td>
<td><code>complex</code>,<code>sqrt()</code>,<code>pow()</code></td>
<td>§14.2</td>
</tr>
<tr>
<td><code>&lt;filesystem&gt;</code></td>
<td><code>path</code></td>
<td>§10.10</td>
</tr>
<tr>
<td><code>&lt;forward_list&gt;</code></td>
<td><code>forward_list</code></td>
<td>§11.6</td>
</tr>
<tr>
<td><code>&lt;fstream&gt;</code></td>
<td><code>fstream</code>,<code>ifstream</code>,<code>ofstream</code></td>
<td>§10.7</td>
</tr>
<tr>
<td><code>&lt;future&gt;</code></td>
<td><code>future</code>,<code>promise</code></td>
<td>§15.7</td>
</tr>
<tr>
<td><code>&lt;ios&gt;</code></td>
<td><code>hex</code>,<code>dec</code>,<code>secientific</code>,<code>fixed</code>,<code>defaultfloat</code></td>
<td>§10.6</td>
</tr>
<tr>
<td><code>&lt;iostream&gt;</code></td>
<td><code>istream</code>,<code>ostream</code>,<code>cin</code>,<code>cout</code></td>
<td>第10章</td>
</tr>
<tr>
<td><code>&lt;map&gt;</code></td>
<td><code>map</code>,<code>multimap</code></td>
<td>§11.5</td>
</tr>
<tr>
<td><code>&lt;memory&gt;</code></td>
<td><code>unique_ptr</code>,<code>shared_ptr</code>,<code>allocator</code></td>
<td>§13.2.1</td>
</tr>
<tr>
<td><code>&lt;random&gt;</code></td>
<td><code>default_random_engine</code>,<code>normal_distribution</code></td>
<td>§14.5</td>
</tr>
<tr>
<td><code>&lt;regex&gt;</code></td>
<td><code>regex</code>,<code>smatch</code></td>
<td>§9.4</td>
</tr>
<tr>
<td><code>&lt;string&gt;</code></td>
<td><code>string</code>,<code>basic_string</code></td>
<td>§9.2</td>
</tr>
<tr>
<td><code>&lt;set&gt;</code></td>
<td><code>set</code>,<code>multiset</code></td>
<td>§11.6</td>
</tr>
<tr>
<td><code>&lt;sstream&gt;</code></td>
<td><code>istringstream</code>,<code>ostringstream</code></td>
<td>§10.8</td>
</tr>
</tbody>
</table>
<p><a class="en-page-number" id="110"></a></p>
<table>
<thead>
<tr>
<th></th>
<th>精选标准库头文件（续）</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>&lt;stdexcept&gt;</code></td>
<td><code>length_error</code>,<code>out_of_range</code>,<code>runtime_error</code></td>
<td>§3.5.1</td>
</tr>
<tr>
<td><code>&lt;thread&gt;</code></td>
<td><code>thread</code></td>
<td>§15.2</td>
</tr>
<tr>
<td><code>&lt;unordered_map&gt;</code></td>
<td><code>unordered_map</code>,<code>unordered_multimap</code></td>
<td>§11.5</td>
</tr>
<tr>
<td><code>&lt;utility&gt;</code></td>
<td><code>move()</code>,<code>swap()</code>,<code>pair</code></td>
<td>第13章</td>
</tr>
<tr>
<td><code>&lt;variant&gt;</code></td>
<td><code>variant</code></td>
<td>§13.5.1</td>
</tr>
<tr>
<td><code>&lt;vector&gt;</code></td>
<td><code>vector</code></td>
<td>§11.2</td>
</tr>
</tbody>
</table>
<p>此列表远称不上面面俱到。</p>
<p>C标准库的头文件，例如<code>stdlib.h</code>也都在。
每个这样的头文件还有个改版，加了<code>c</code>前缀，移除了<code>.h</code>。
这样的版本，比如<code>&lt;cstdlib&gt;</code>把它的声明都放进了命名空间<code>std</code>。</p>
<h2 id="8.4">8.4 忠告 </h2>
<ul>
<li>[1] 别重复造轮子，用库；§8.1; [CG: SL.1]。</li>
<li>[2] 面临选择的时候，相较于其它的库，优先选标准库；§8.1; [CG: SL.2]。</li>
<li>[3] 别盲目觉得标准库通吃一切；§8.1。</li>
<li>[4] 针对使用的部件，记得<code>#include</code>其头文件；§8.3。</li>
<li>[5] 记住，标准库部件定义在命名空间<code>std</code>里；§8.3; [CG: SL.3]。</li>
</ul>
<blockquote id="fn_1">
<sup>1</sup>. 出自连环漫画集“The Complete Calvin and Hobbes”其中一册叫“Attack of the Deranged Mutant Killer Monster Snow Goons”，中文版为《卡尔文与霍布斯虎》系列丛书的第三册《变种雪怪杀手》，其中把此句译为“如果无知是瞬时的，为什么还要花时间学习呢？”，译者结合该小故事的上下文，认为该如此翻译。<a href="#reffn_1" title="Jump back to footnote [1] in the text."> ↩</a>
</blockquote>

<script>console.log(window.location.pathname)</script>
<div id="disqus_thread"></div>
<script>

/**
*  RECOMMENDED CONFIGURATION VARIABLES: EDIT AND UNCOMMENT THE SECTION BELOW TO INSERT DYNAMIC VALUES FROM YOUR PLATFORM OR CMS.
*  LEARN WHY DEFINING THESE VARIABLES IS IMPORTANT: https://disqus.com/admin/universalcode/#configuration-variables*/
/*
var disqus_config = function () {
this.page.url = window.location.href;
this.page.identifier = window.location.pathname;
};
*/
(function() { // DON'T EDIT BELOW THIS LINE
var d = document, s = d.createElement('script');
s.src = 'https://a-tour-of-cpp-2nd-cn.disqus.com/embed.js';
s.setAttribute('data-timestamp', +new Date());
(d.head || d.body).appendChild(s);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="https://disqus.com/?ref_noscript" target="_blank">comments powered by Disqus.</a></noscript>
                                
    

                                </section>
                            
    </div>
    <div class="search-results">
        <div class="has-results">
            
            <h1 class="search-results-title"><span class='search-results-count'></span> results matching "<span class='search-query'></span>"</h1>
            <ul class="search-results-list"></ul>
            
        </div>
        <div class="no-results">
            
            <h1 class="search-results-title">No results matching "<span class='search-query'></span>"</h1>
            
        </div>
    </div>
</div>

                        </div>
                    </div>
                
            </div>

            
                
                <a href="ch07.html" class="navigation navigation-prev " aria-label="Previous page: 7 概束和泛型编程">
                    <i class="fa fa-angle-left"></i>
                </a>
                
                
                <a href="ch09.html" class="navigation navigation-next " aria-label="Next page: 9 字符串和正则表达式">
                    <i class="fa fa-angle-right"></i>
                </a>
                
            
        
    </div>

    <script>
        var gitbook = gitbook || [];
        gitbook.push(function() {
            gitbook.page.hasChanged({"page":{"ch":8,"title":"8 标准库概览","level":"1.10","depth":1,"next":{"title":"9 字符串和正则表达式","level":"1.11","depth":1,"path":"ch09.md","ref":"ch09.md","articles":[]},"previous":{"title":"7 概束和泛型编程","level":"1.9","depth":1,"path":"ch07.md","ref":"ch07.md","articles":[]},"dir":"ltr"},"config":{"plugins":["@dogatana/page-toc-button","@dogatana/back-to-top-button","copy-code-button","forkmegithub","disqus-legacy"],"root":"./src","styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"pluginsConfig":{"@dogatana/back-to-top-button":{},"styles":{"website":"styles/website.css"},"search":{},"@dogatana/page-toc-button":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"fontsettings":{"theme":"white","family":"sans","size":2},"highlight":{},"disqus-legacy":{"shortname":"a-tour-of-cpp-2nd-cn"},"copy-code-button":{},"forkmegithub":{"color":"orange","url":"https://github.com/windsting/a-tour-of-cpp-2nd-cn"},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"theme":"default","author":"Windsting","pdf":{"pageNumbers":true,"fontSize":14,"fontFamily":"Arial","paperSize":"a5","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56},"embedFonts":false},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"variables":{},"title":"C++导览 第二版 简体中文版","language":"zh-hans","links":{"sidebar":{"Github Link":"https://github.com/windsting/a-tour-of-cpp-2nd-cn"}},"gitbook":"*","description":"A Tour of C++ (第二版) 非官方中译本"},"file":{"path":"ch08.md","mtime":"2023-01-28T09:55:59.821Z","type":"markdown"},"gitbook":{"version":"5.1.1","time":"2023-10-27T09:54:29.738Z"},"basePath":".","book":{"language":""}});
        });
    </script>
</div>

        
    <noscript>
        <style>
            .honkit-cloak {
                display: block !important;
            }
        </style>
    </noscript>
    <script>
        // Restore sidebar state as critical path for prevent layout shift
        function __init__getSidebarState(defaultValue){
            var baseKey = "";
            var key = baseKey + ":sidebar";
            try {
                var value = localStorage[key];
                if (value === undefined) {
                    return defaultValue;
                }
                var parsed = JSON.parse(value);
                return parsed == null ? defaultValue : parsed;
            } catch (e) {
                return defaultValue;
            }
        }
        function __init__restoreLastSidebarState() {
            var isMobile = window.matchMedia("(max-width: 600px)").matches;
            if (isMobile) {
                // Init last state if not mobile
                return;
            }
            var sidebarState = __init__getSidebarState(true);
            var book = document.querySelector(".book");
            // Show sidebar if it enabled
            if (sidebarState && book) {
                book.classList.add("without-animation", "with-summary");
            }
        }

        try {
            __init__restoreLastSidebarState();
        } finally {
            var book = document.querySelector(".book");
            book.classList.remove("honkit-cloak");
        }
    </script>
    <script src="gitbook/gitbook.js"></script>
    <script src="gitbook/theme.js"></script>
    
        
        <script src="gitbook/@dogatana/honkit-plugin-page-toc-button/plugin.js"></script>
        
    
        
        <script src="gitbook/@dogatana/honkit-plugin-back-to-top-button/plugin.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-copy-code-button/toggle.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-forkmegithub/plugin.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-search/search-engine.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-search/search.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-lunr/lunr.min.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-lunr/search-lunr.js"></script>
        
    
        
        <script src="gitbook/gitbook-plugin-fontsettings/fontsettings.js"></script>
        
    

    </body>
</html>

